package com.simon.cdc.sql;

import cn.hutool.json.JSONObject;
import com.simon.cdc.event.ChangeEvent;

import java.util.StringJoiner;

/**
 * UPDATE语句生成器
 */
final class UpdateStatement {
    private static final String TEMPLATE = "UPDATE %s SET %s WHERE %s";

    private final ChangeEvent event;

    UpdateStatement(ChangeEvent event) {
        this.event = event;
    }

    /**
     * 构建SQL更新语句
     * <p>
     * 此方法构造一个SQL更新语句，根据事件的更改状态和主键信息生成SET子句和WHERE子句
     * 它使用StringJoiner来组装SET子句，并利用SQLValueFormatter来格式化值以确保SQL安全性
     * 最后，它将所有部分格式化为一个完整的SQL更新语句
     *
     * @return 完整的SQL更新语句
     */
    String build() {
        // 使用逗号分隔的StringJoiner来组装SET子句
        StringJoiner setClause = new StringJoiner(",");

        // 遍历事件的更改状态，将每个更改格式化并添加到SET子句中
        event.getAfterState().forEach((key, value) ->
                setClause.add(key + "=" + SQLValueFormatter.format(value)));

        // 获取事件的主键信息，用于WHERE子句
        JSONObject primaryKeys = event.getPrimaryKeys();

        // 使用格式化字符串构造完整的SQL更新语句
        String format = String.format(TEMPLATE,
                event.getTableName(),
                setClause.toString(),
                new WhereClause(primaryKeys).build());

        // 打印构造的SQL语句
        System.out.println(format);

        // 返回构造的SQL语句
        return format;
    }
}